package org.jeecg.modules.demo.Kingdee.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.jeecg.modules.demo.Kingdee.config.FileStorageConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * 文件存储服务类
 * 处理电子回单文件的保存和解压操作
 */
@Slf4j
@Service
public class FileStorageService {

    @Autowired
    private FileStorageConfig fileStorageConfig;

    /**
     * 保存并解压电子回单文件
     * 
     * @param fileContent Base64编码的ZIP文件内容
     * @return 解压后的文件路径（只保留解压后的文件）
     * @throws IOException IO异常
     */
    public String saveAndExtractReceiptFile(String fileContent) throws IOException {
        if (!StringUtils.hasText(fileContent)) {
            throw new IllegalArgumentException("文件内容不能为空");
        }

        // 获取存储目录
        String storagePathStr = fileStorageConfig.getReceiptPath();
        Path storagePath = Paths.get(storagePathStr);
        if (!Files.exists(storagePath)) {
            Files.createDirectories(storagePath);
        }

        // 解码Base64内容
        byte[] decodedBytes = Base64.decodeBase64(fileContent);
        
        // 解压文件并返回解压后文件的路径
        String extractedFilePath = extractZipFile(decodedBytes, storagePath);

        return extractedFilePath;
    }

    /**
     * 解压ZIP文件，只保留解压后的文件
     * 
     * @param zipData ZIP文件数据
     * @param targetPath 目标路径
     * @return 解压后文件的绝对路径
     * @throws IOException IO异常
     */
    private String extractZipFile(byte[] zipData, Path targetPath) throws IOException {
        String extractedFilePath = null;
        
        try (ByteArrayInputStream bis = new ByteArrayInputStream(zipData);
             ZipInputStream zis = new ZipInputStream(bis)) {
            
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                if (!entry.isDirectory()) {
                    String entryName = entry.getName();
                    Path entryPath = targetPath.resolve(entryName);
                    
                    // 检查文件是否已存在，如果存在则直接记录路径，不执行保存
                    if (Files.exists(entryPath)) {
                        log.info("文件已存在，直接使用: {}", entryPath.toAbsolutePath());
                        extractedFilePath = entryPath.toAbsolutePath().toString();
                        zis.closeEntry();
                        continue;
                    }
                    
                    // 确保父目录存在
                    if (entryPath.getParent() != null && !Files.exists(entryPath.getParent())) {
                        Files.createDirectories(entryPath.getParent());
                    }
                    
                    // 保存文件
                    Files.copy(zis, entryPath);
                    log.info("已解压文件: {}", entryPath.toAbsolutePath());
                    
                    // 记录解压后的文件路径（通常只有一个文件）
                    extractedFilePath = entryPath.toAbsolutePath().toString();
                }
                zis.closeEntry();
            }
        }
        
        return extractedFilePath;
    }

    /**
     * 获取存储路径
     * 
     * @return 存储路径
     */
    public String getStoragePath() {
        return fileStorageConfig.getReceiptPath();
    }
}